package vip.meeet.jdk.gc;

/**
 * -verbose:gc -Xms20M -Xmx20M -Xmn10M -XX:+PrintGCDetails -XX:SurvivorRatio=8
 * -server -verbose:gc -Xms20M -Xmx20M -Xmn10M -XX:+PrintGCDetails -XX:SurvivorRatio=8
 *
 * MinorGC:发生在新生代的GC
 * MajorGC，FullGC 发生在来年代的GC，比MinorGC慢很多
 *
 * https://visualvm.github.io/pluginscenters.html
 */
@SuppressWarnings("unused")
public class MinorGC {

    public static final int MB = 1024 * 1024;

    public static void main(String[] args) {
//        minorGC();
        pretenureSizeThreshold();
    }

    private static void minorGC(){
        byte[] arr1,arr2,arr3,arr4;
        arr1 = new byte[2 * MB];
        arr2 = new byte[2 * MB];
        arr3 = new byte[2 * MB];
        arr4 = new byte[4 * MB];
    }

    /**
     * 大对象直接进入老年代
     * -XX:PretenureSizeThreshold=3145728 只对Serial和ParaNew 有效,PSY无效
     * -XX:+UseSerialGC
     * -XX:+UseParNewGC
     */
    private static void pretenureSizeThreshold(){
        byte [] data = new byte[4 * MB];
    }

    /**
     * -XX:MaxTenuringThreshold=1
     * 并不是强制的，还会判断：
     * 如果Survivor空间中相同年龄所有的对象大小的总和大于Survivor空间一半，
     * 那么大于或者等于该年龄的对象就会直接进入老年代
     */
    private static void maxTenuringThreshold(){
        byte[] arr1,arr2,arr3;
        arr1 = new byte[MB/4];
        arr2 = new byte[4 * MB];
        arr3 = null;
        arr3 = new byte[4 * MB];
    }

    /**
     * -XX:+HandlePromotionFailure
     * 空间分配担保
     * MinorGC之前，先检查老年代的最大连续可用空间是否大于新生代所有对象的总和，如果大于，安全
     * 否则，查看是否配置空间分配担保，如果没有担保，执行Full GC
     * 如果有担保，检查老年代最大连续可用空间是否大于，历次晋升到老年代的平均大小：
     * 小于执行Full GC
     * 大于，尝试执行Minor GC
     */
    private static void handPromotionFailure(){

    }
}
